package br.ufpa.cbcc2007.dikemon.engine;

import java.io.IOException;

import javax.microedition.lcdui.Graphics;
import javax.microedition.lcdui.Image;
import javax.microedition.lcdui.game.GameCanvas;

import br.ufpa.cbcc2007.dikemon.exception.MapNotFoundException;

// Classe que controla o fluxo principal do programa
//  Responsável por manter o FPS, obter a o estado das teclas e
//  por controlar cada Frame (quadro) da Aplicação.
// A lógica do jogo em si, o controle do que será colocado na tela é
//  delegado a Scene.
public class Engine extends GameCanvas implements Runnable{
	// A cena que está sendo atualmente exibida.
	private Scene actualScene;
	private Image font;
	private Image backText;

	/// Constante do tamanho em pixels do tile
	public static final int TILESIZE = 16;
	/// Instancia Global
	private static Engine instance;
 
	/// Construtor
	/// Scene é cena inicial, e supressKeyEvents, se ativado, inibe o mapeamento 
	///   automatico de botões.  
	public Engine(Scene scene, boolean suppressKeyEvents) throws MapNotFoundException {
		super(suppressKeyEvents);
		try {
			//Instanciando a fonte e o fundo de texto padrão.
			font = Image.createImage("/font.png");
			backText = Image.createImage("/textbox.png");
		} catch (IOException e) {
			e.printStackTrace();
		}
		actualScene = scene;
		instance =  this;
	}

	public void run() {
		//Obtendo o gráfico da tela atual;
		Graphics graphics = getGraphics();
		//loop sem condição. Parece infinito;
		for(;;){
			//Pintando a tela: 0xFFFFFF seria branco e 0x000000 é preto
			graphics.setColor(0x000000);
			graphics.fillRect(0, 0, getWidth(), getHeight());

			//Permitindo que Scene atual se atualize e se pinte
			actualScene.actualize(getKeyStates());
			actualScene.paint(graphics, 0, 0);
			//Atualiza a tela
			flushGraphics();
			try {
				//Pequeno delay para manter uma taxa de atualização contante
				// (aprox. 33 frames por segundo
				Thread.sleep(30);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
	}
	

	public Image getFont() {
		return font;
	}

	public void setFont(Image font) {
		this.font = font;
	}

	public static Engine getEngine() {
		return instance;
	}
	public Scene getActualScene() {
		return actualScene;
	}

	public void setActualScene(Scene actualScene) {
		this.actualScene = actualScene;
	}

	public Image getBackText() {
		return backText;
	}

	public void setBackText(Image backText) {
		this.backText = backText;
	}

}
